<?
/**
 * @file funciones.class.php
 * Clase que añade ciertas funciones que utilizan casi todos los sistemas
 * @package MTHFrame
 * @author meth < mth at mthweb.org >
 * @date 16 April 2007
 */

define('UTF_8', 1);
define('ASCII', 2);
define('ISO_8859_1', 3);

if(!@include(dirname(__FILE__).'/inputfilter/class.inputfilter_clean.php')) die('No se pudo cargar clase para filtrar entradas');

class funciones{
/**
 * @var object Variable que almacena el objeto de la clase InputFilter
 */
 var $inputFilter;

    /**
     * Función constructora de la clase, no hace nada porque no hay que inicializar ninguna variable
     * ni nada
     */
    function __construct(){
    	$this->inputFilter = new InputFilter('a,h1,h2,h3,h4,h5,h6,p,img,a,em,strong','href,rel',1,1,1);
    }//FIN __construct

/*****************************************************************************************************
FUNCIONES DE PROCESADO DE CADENAS FUNCIONES DE PROCESADO DE CADENAS FUNCIONES DE PROCESADO DE CADENAS
FUNCIONES DE PROCESADO DE CADENAS FUNCIONES DE PROCESADO DE CADENAS FUNCIONES DE PROCESADO DE CADENAS
FUNCIONES DE PROCESADO DE CADENAS FUNCIONES DE PROCESADO DE CADENAS FUNCIONES DE PROCESADO DE CADENAS
*****************************************************************************************************/
    /**
     * Función que limpia una cadena html, eliminando comentarios, tabulaciones, espacios entre
     * etiquetas, etc... para que la salida de los scripts sea más limpia y ocupe menos
     * @param string Cadena con el html
     * @return string Cadena html limpia
     */
    function sanitize_output($buffer=''){
        //ELIMINA COMENTARIO
        $buffer = preg_replace('/<!--(.|\s)*?-->/','', $buffer);
        //ELIMINA TABULACIONES
        $buffer = strtr($buffer, array("\t" => ""));
        //ELIMINA VARIOS ESPACIOS Y LOS CONVIERTE A UNO SOLO
        $buffer = ereg_replace(" {2,}", ' ',$buffer);
        //ELIMINA ESPACIOS ENTRE ETIQUETAS
        $buffer = str_replace('> <','><', $buffer);
        //ELIMINA ESPACIOS DELANTE Y DETRAS DE &nbsp;
        $buffer = str_replace(' &nbsp;','&nbsp;', $buffer);
        $buffer = str_replace('&nbsp; ','&nbsp;', $buffer);
        //ELIMINA LINEAS EN BLANCO
        $buffer = preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/","", $buffer);
		$lineas = split("\n",$buffer);
		$buffer = '';
		foreach($lineas as $linea)//ELIMINA ESPACIOS EN BLANCO DELANTE DE LAS LINEAS
			$buffer .= trim($linea)."\n";
		//ELIMINA SALTOS DE LINEA ENTRE ETIQUETAS
		$buffer = str_replace(">\n<",'><',$buffer);
		//ELIMINA SALTOS DE LINEA DELANTE DE ETIQUETAS
		$buffer = str_replace("\n<",'<',$buffer);
		//ELIMINA SALTOS DE LINEA DETRAS DE ETIQUETAS
		$buffer = str_replace(">\n",'>',$buffer);
		//LIMPIA ETIQUETAS MAL FORMADAS
		$buffer = $this->limpia_contenido($buffer);
        return $buffer;
    }//FIN sanitize_output

    /**
     * Función que elimina caracteres no estándar de una cadena
     * @param string nombre Cadena a limpiar
     * @param string reemplazo Todos los espacios en blanco y cualquier otro carácter será reemplazado por esta cadena
     * @return string Cadena ya limpia
     */
    function limpia_nombre($nombre='',$reemplazo='-'){
       $nombre = htmlentities(strtolower($nombre));
       $nombre = preg_replace("/&(.)(acute|cedil|circ|ring|tilde|uml);/","$1", $nombre);
       $nombre = preg_replace("/([^a-z0-9]+)/",$reemplazo,html_entity_decode($nombre));
       $nombre = trim($nombre,$reemplazo);
       return $nombre;
    }//FIN _limpia_nombre

    /**
     * Función que comprueba si un correo dado es correcto
     * @param string Dirección de correo
     * @return boolean true o false según si es válido o no
     */
    function ismail($correo){
        if (eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$",$correo))
          return true;
        else return false;
    }//FIN ismail

    /**
     * Función que comprueba si una url proporcionada es válida
     * además de comprobar si el último carácter no es / entonces se lo añade
     * por lo que el parámetro de entrada url se le pasa por valor
     * @param string Cadena con la url
     * @return boolean true o false si es válida o no
     */
    function isweb(&$url){
        if (eregi("^(http|ftp|https)://([\w-]+\.)+(/[\w- ./?%&=]*)$",$url))
            return true;
        else return false;
    }//FIN isweb

    /**
     * Función que decodifica mediante utf8 una matriz
     * @param array Matriz a decodificar
     * @return array Matriz decodificada
     */
    function array_utf8_decode($matriz=array()){
        if(is_array($matriz)){//SI ES ARRAY TODO SIGUE BIEN
            foreach ($matriz as $key => $value)
                $matriz[$key] = utf8_decode($value);
            return $matriz;
        }
        else return false;//
    }//FIN array_utf8_decode

    /**
     * Función que codifica mediante utf8 una matriz
     * @param array Matriz a decodificar
     * @return array Matriz decodificada
     */
    function array_utf8_encode($matriz=array()){
        if(is_array($matriz)){//SI ES ARRAY TODO SIGUE BIEN
            foreach ($matriz as $key => $value)
                $matriz[$key] = utf8_encode($value);
            return $matriz;
        }
        else return false;//
    }//FIN array_utf8_decode

    function limpiarEntrada($entrada=''){
    	//$entrada = $this->limpia_etiquetas($entrada);
    	return $this->inputFilter->process($entrada);
    }//FIN limpiarEntrada

	function array_limpiarEntrada($matriz=array()){
        if(is_array($matriz)){//SI ES ARRAY TODO SIGUE BIEN
            foreach ($matriz as $key => $value)
                $matriz[$key] = $this->limpiarEntrada($value);
            return $matriz;
        }
        else return false;//
	}//FIN array_limpiarEntrada

    /**
     * Función que limpia etiquetas HTML no válidas una cadena de texto que pueda contener etiquetas HTML
     * @param string cadena Cadena con etiquetas HTML que hay que limpiar
     * @return string Cadena limpia de etiquetas HTML no válidas
     * @access public
     */
     function limpia_etiquetas($cadena='',$permitidas='a,h1,h2,h3,h4,h5,h6,p,img,a,em,strong'){
     	return strip_tags($cadena,$permitidas);
     }

     /**
      * Función que limpia de etiquetas HTML no válidas una matriz con cadenas de texto
      * @param array matriz Matriz con las cadenas de texto que hay que limpiar
      * @return array Matriz con las cadenas de texto ya limpias
      * @access public
      */
      function array_limpia_etiquetas($matriz=array()){
      	$retorno = array();
      	foreach($matriz as $key => $value)
      		$retorno[$key] = $this->limpia_etiquetas($value);
      	return $retorno;
      }

      /**
       * Función que recorta un texto en el número de palabras indicado
       * @param string cadena Cadena de texto a recortar
       * @param int num Número de palabras que va a contener la nueva cadena ya recortada
       * @return string Cadena ya recortada
       */
      function recortarTexto($cadena='',$num=30){
      	if(strpos($cadena,' ')){
      		$retorno = '';
      		$palabras = split(' ',$cadena);
      		for($i=0;$i<$num;$i++)
      			$retorno .= $palabras[$i].' ';
      		return $retorno.'...';
      	}
      	else return $cadena;
      }

	/**
	 * Función que detecta si la codificación de un texto es utf8 o iso
	 */
	function codificacion($texto){
		$c = 0;
		$ascii = true;
		$limite = strlen($texto);
		for ($i = 0;$i<$limite;$i++){
			$byte = ord($texto[$i]);
			if ($c>0){
				if (($byte>>6) != 0x2) return ISO_8859_1;
				else $c--;
			}
			elseif ($byte&0x80){
				$ascii = false;
				if (($byte>>5) == 0x6) $c = 1;
				elseif (($byte>>4) == 0xE) $c = 2;
				elseif (($byte>>3) == 0x1E) $c = 3;
				else return ISO_8859_1;
			}
		}
		return ($ascii) ? ASCII : UTF_8;
	}//FIN codificacion

	/**
	 * Función que codifica una cadena en utf8 si no está codificada ya
	 */
	function utf8_encode_seguro($texto){
		return ($this->codificacion($texto)==ISO_8859_1) ? utf8_encode($texto) : $texto;
	}


/**********************************************************************************
FUNCIONES DE HTML FUNCIONES DE HTML FUNCIONES DE HTML FUNCIONES DE HTML
FUNCIONES DE HTML FUNCIONES DE HTML FUNCIONES DE HTML FUNCIONES DE HTML
FUNCIONES DE HTML FUNCIONES DE HTML FUNCIONES DE HTML FUNCIONES DE HTML
**********************************************************************************/

    /**
     * Función que convierte en entidades HTML todos los caracteres de una cadena
     * exceptuando las etiquetas HTML
     * @param string Cadena a convertir
     * @return string Cadena convertida
     */
    function htmlEncodeText($string=''){
        $pattern = '<([a-zA-Z0-9\.\, "\'_\/\-\+~=;:\(\)?&#%![\]@]+)>';
        preg_match_all ('/' . $pattern . '/', $string, $tagMatches, PREG_SET_ORDER);
        $textMatches = preg_split ('/' . $pattern . '/', $string);
        foreach ($textMatches as $key => $value)
            $textMatches [$key] = htmlentities ($value);
        for ($i = 0; $i < count ($textMatches); $i ++)
            $textMatches [$i] = $textMatches [$i] . $tagMatches [$i] [0];
        return implode ($textMatches);
    }//FIN htmlEncodeText

	/**
	 * Función que convierte los datos de un array a entidades HTML
	 * @param array Matriz a convertir
	 * @return array Matriz convertida
	 */
	function array_htmlEncodeText($matriz=array()){
		if(is_array($matriz)){
			foreach($matriz as $key => $value)
				$matriz[$key] = $this->htmlEncodeText($value);

			return $matriz;
		}
		else return false;
	}//FIN array_htmlEncodeText

    /**
     * Función que decodifica las entidades HTML de todas las cadenas contenidas en una matriz
     * @param array matriz Matriz que contiene las cadenas a convertir
     * @return array Matriz que contiene las cadenas convertidas
     */
    function array_html_entity_decode($matriz=array()){
        if(is_array($matriz)){//SI ES ARRAY TODO SIGUE BIEN
            foreach ($matriz as $key => $value)
                $matriz[$key] = html_entity_decode($value);
            return $matriz;
        }
        else return false;
    }//FIN array_html_entity_decode

    /**
     * Función que convierte a url una cadena de la forma http://....
     * @param string Cadena a convertir
     * @return string Cadena convertida
     */
    function url_to_link($text='') {
        $text = preg_replace('!(^|([^\'"]\s*))'.'([hf][tps]{2,4}:\/\/[^\s<>"\'()]{4,})!mi','$2<a href="$3">$3</a>', $text);
        $text = preg_replace('!<a href="([^"]+)[\.:,\]]">!','<a href="$1">',$text);
        $text = preg_replace('!([\.:,\]])</a>!','</a>$1',$text);
        return $text;
    }//FIN url_to_link

    /**
     * Función que completa una URL a la que le falta el protocolo
     *
     * @param string Cadena con la dirección de la URL
     * @param string Protocolo a añadir a la URL
     * @return string URL completa
     */
    function complete_url($url, $protocol = "http://"){
        if (substr_count($url,"://") == 0)
            $url = $protocol . $url;

        if (substr_count($url,"://www.") == 0)
            $url = substr_replace($url,"www.",strpos($url, ":")+3,0);

        return $url;
    }//FIN complete_url

    /**
     * Función que limpia fallos en el HTML como puede ser poner un salto de línea tras una etiqueta
     * de párrafo
     *
     */
    function limpia_contenido($contenido=''){
		//ELIMINA ETIQUETAS SIN UTILIDAD
        $contenido = str_replace('<ul><br />','<ul>',$contenido);
        $contenido = str_replace('</ul><br />','</ul>',$contenido);
        $contenido = str_replace('<ol><br />','<ol>',$contenido);
        $contenido = str_replace('</ol><br />','</ol>',$contenido);
        $contenido = str_replace('<li><br />','<li>',$contenido);
        $contenido = str_replace('</li><br />','</li>',$contenido);
        $contenido = str_replace('<p><br />','<p>',$contenido);
        $contenido = str_replace('</p><br />','</p>',$contenido);
		//ELIMINA ETIQUETAS VACIAS
		$contenido = str_replace('<p></p>','',$contenido);
		$contenido = str_replace('<span></span>','',$contenido);
		$contenido = str_replace('<div></div>','',$contenido);
		$contenido = str_replace('<ul></ul>','',$contenido);
		$contenido = str_replace('<li></li>','',$contenido);
		$contenido = str_replace('<strong></strong>','',$contenido);
		$contenido = str_replace('<em></em>','',$contenido);
        return $contenido;
    }//FIN limpia_contenido

    /**
     * Función que realiza la operación a nl2br, es decir convierte <br /> a saltos de líneas
     * @param string Cadena a convertir
     * @return string Cadena convertida
     */
    function br2nl ($string=''){
        $txt = str_replace("<br />","\n",$string);
        $txt = str_replace("<br>","\n",$txt);
        return $txt;
    }//FIN br2nl

/**********************************************************************************
FUNCIONES VARIAS FUNCIONES VARIAS FUNCIONES VARIAS FUNCIONES VARIAS
FUNCIONES VARIAS FUNCIONES VARIAS FUNCIONES VARIAS FUNCIONES VARIAS
FUNCIONES VARIAS FUNCIONES VARIAS FUNCIONES VARIAS FUNCIONES VARIAS
**********************************************************************************/

	/**Función que da formato a una fecha extraida de la base de datos al formato
	 * latino
	 * @param string Cadena con la fecha
	 * @param boolean Si es tru entonces agregamos la hora a la cadena
	 * si es false solo devolvemos la parte de la fecha
	 * @return string Cadena convertida
	 */
	function fecha_convertir($fecha='',$conhora=false){
		$meses = array(1 => 'Enero',2 => 'Febrero',3 => 'Marzo',4 => 'Abril',5 => 'Mayo',6 =>'Junio',7 => 'Julio',8 => 'Agosto',9 => 'Septiembre',10 => 'Octubre',11 => 'Noviembre',12 => 'Diciembre');
	if(strpos($fecha,' ')){
		list($fecha,$hora) = split(' ',$fecha);
		$f = split('-',$fecha);
	}
	else	$f = split('-',$fecha);
		//PROCESAMOS FECHA PORQUE HORA ESTA BIEN
		$mes = (int)$f[1];
		if ($conhora) return $f[2].' - '.$meses[$mes].' - '.$f[0].' '.$hora;
		else return $f[2].' - '.$meses[$mes].' - '.$f[0];
	}

	 /**
     * Función que obtiene la extensión de un archivo proporcionando el nombre del
     * archivo
     *
     * @param string  Nombre del archivo
     * @return string Cadena con la extensión del archivo, sin el .
     */
    function get_ext($file_name=''){
    	if(strpos($file_name,'.')){
	        $efile_name = explode('.',$file_name);
	        $ext = $efile_name[count($efile_name) - 1];
        	return $ext;
    	}
    	else return false;
    }//FIN get_ext

	 /**
     * Función que obtiene el nombre de un archivo quitando la extensión de este
     *
     * @param string  Nombre del archivo
     * @return string Nombre del archivo sin extensión
     */
    function get_name($file_name=''){
    	if(strrpos($file_name,'.')){
			return substr($file_name,0,strrpos($file_name,'.'));
    	}
    	else return false;
    }//FIN get_name

	/**
	 * Función que genera una cadena aleatoria
	 * @param int lenght Tamaño de la cadena a generar
	 * @param string possible Cadena con los posibles caracteres a utilizar por defecto es ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghjkmnpqrstuvwxyz0123456789
	 * @return string Cadena generada
	 */
	function random_string($length=8,$possible='ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghjkmnpqrstuvwxyz0123456789'){
	  $string = '';
	  $i = 0;
	  while ($i < $length) {
	    $char = substr($possible, mt_rand(0, strlen($possible)-1), 1);
	    if (!strstr($string, $char)) {
	      $string .= $char;
	      $i++;
	    }
	  }
	  return $string;
	}//FIN random_string

	/**
	 * Función que convierte en bytes una cantidad de Gb/Mb/Kb dada, útil para conseguir el max_upload_size de php.ini
	 * Obtenida desde http://www.php.net/manual/en/function.ini-get.php
	 * @param string val Cadena que contiene el valor a pasar a bytes
	 * @return string Cantidad de bytes que representa la entrada a la función
	 */
	function return_bytes($val='') {
	    $val = trim($val);
	    $last = strtolower($val{strlen($val)-1});
	    switch($last) {
	        // The 'G' modifier is available since PHP 5.1.0
	        case 'g':
	            $val *= 1024;
	        case 'm':
	            $val *= 1024;
	        case 'k':
	            $val *= 1024;
	    }
	    return $val;
	}

}
?>